<?php
namespace app\common\controller;
/**
 * 获取OSS服务端签名类
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/3/10
 * Time: 14:31
 */
class OssClient extends  \think\Controller
{
    private $accessKeyId = 'LTAI5tN8YApuuW5NEi9LDbwr';//请填写您的AccessKeyId
    private $accessKeySecret = 'rit7irfyfB8zGUXwRtH94kPJBOvp41';//请填写您的AccessKeySecret
    private $host = 'https://oss-cn-beijing.aliyuncs.com';//$host的格式为 bucketname.endpoint，请替换为您的真实信息 （就是Bucket域名-外网访问直接复制粘贴再此就行）
    private $callbackUrl = 'http://dy.mt.com/callback.php';//上传回调的地址 还记得上图中callback.php文件吗，把这文件放在你的项目中，配个路由保证能访问到这个文件就行，这个值就是访问callback.php此文件的URL 例如：我放在项目根目录 那值就为 http://liutong.pro/callback.php
    /**
     * 获取OSS应用服务端签名
     * 这里都是官网的源码，我没什么改动
     * @param (string)$dir : 上传到OSS的文件路径 如文件权路径为 image/001.png  那么 $dir = 'image/';  即可
     */
    public function getOssSignature()
    {
        $id = $this->accessKeyId;          // 请填写您的AccessKeyId。
        $key = $this->accessKeySecret;     // 请填写您的AccessKeySecret。
// $host的格式为 bucketname.endpoint，请替换为您的真实信息。
        $host = $this->host;
// $callbackUrl为上传回调服务器的URL，请将下面的IP和Port配置为您自己的真实URL信息。
        $callbackUrl = $this->callbackUrl;

        $callback_param = array('callbackUrl' => $callbackUrl,
            'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
            'callbackBodyType' => "application/x-www-form-urlencoded");
        $callback_string = json_encode($callback_param);

        $base64_callback_body = base64_encode($callback_string);
        $now = time();
        $expire = 30;  //设置该policy超时时间是10s. 即这个policy过了这个有效时间，将不能访问。
        $end = $now + $expire;
        $expiration = $this->gmt_iso8601($end);


//最大文件大小.用户可以自己设置
        $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
        $conditions[] = $condition;

// 表示用户上传的数据，必须是以$dir开始，不然上传会失败，这一步不是必须项，只是为了安全起见，防止用户通过policy上传到别人的目录。
//        $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
        $conditions[] = $start;


        $arr = array('expiration' => $expiration, 'conditions' => $conditions);
        $policy = json_encode($arr);
        $base64_policy = base64_encode($policy);
        $string_to_sign = $base64_policy;
        $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

        $response = array();
        $response['accessid'] = $id;
        $response['host'] = $host;
        $response['policy'] = $base64_policy;
        $response['signature'] = $signature;
        $response['expire'] = $end;
        $response['callback'] = $base64_callback_body;
        echo json_encode($response);
    }

    private function gmt_iso8601($time)
    {
        $dtStr = date("c", $time);
        $mydatetime = new \DateTime($dtStr);
        $expiration = $mydatetime->format(\DateTime::ISO8601);
        $pos = strpos($expiration, '+');
        $expiration = substr($expiration, 0, $pos);
        return $expiration . "Z";
    }
}


?>

